<?php  
/**
 * 
 * Autor				: 	Juan Jose Muñiz Juarez
 * Fecha de Creacion	: 	29/04/2012,  03:08:20
 * Version 				: 	1.0
 * Descripcion 			:
 */

  if ( !defined( "RUTA_FISICA_SISTEMA" ) )
   {
      require_once '../../../../config/Constantes.php';
   }

  $ruta_sistema = RUTA_FISICA_SISTEMA . "/sistema/";
  
  require_once $ruta_sistema . "general/clases/comun/ConfiguracionGeneral.php";
  require_once $ruta_sistema . "general/clases/comun/archivos/OperacionArchivo.php";
  require_once $ruta_sistema . "general/clases/comun/GeneralORM.php";
          
class GeneracionModelo
   {
      private $_contenido;
      private $_contenido_constructor;
      private $_contenido_clone;
      private $_variables;
      private $_metodos_get;
      private $_metodos_set;
      private $_prefijo_clase;
      private $_info_campo;
      private $_campos;

      /**
       * 
       * Nombre         	: 	__construct
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	29/04/2012, 03:39:30
       */
      public function __construct( $prefijo = "" )
         {
            if ( $prefijo )
              {
                 $this -> _prefijo_clase = $prefijo;
              }
            else
              {
                 $this -> _prefijo_clase = "M";
              }  
              
            $this -> _metodos_get = array ( );
            $this -> _metodos_set = array ( );
            $this -> _variables = array( );
            $this -> _contenido_constructor = array();
            $this -> _contenido_clone = array();
            $this -> _info_campo = array();
            $this ->_campos = array();
         }


         /**
          * 
          * Nombre         	: 	generarClase
          * Descripcion   	:	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	29/04/2012, 03:40:00
          * @param unknown_type $nombre_clase
          * @param unknown_type $ubicacion
          */
      public function generarClase( $nombre_clase, $ubicacion, $etiqueta_fin = false )
         {
            $contenido = "<?php ";
            $contenido .= PHP_EOL;
            $contenido .= " //      CLASE GENERADA AUTOMATICAMENTE " . PHP_EOL;
            
            $tabla = $nombre_clase;
            $nombre_clase = GeneralORM::generarNombreModelo( $nombre_clase );
            
            if ( ConfiguracionGeneral::get( "ORM_GENERAR_COMENTARIOS_CLASE" ) == "1" )
              {
                 $contenido .= $this -> generarComentario( $nombre_clase, null, null, $tabla );                 
              }
            
            $contenido .= "class " . $nombre_clase;
            $contenido .= PHP_EOL;
            $contenido .= "   { ";
            $contenido .= PHP_EOL;
            $contenido .= $this -> getVariables( );
            $contenido .= PHP_EOL;
            $contenido .= $this -> getContructor( );
            $contenido .= PHP_EOL;
            $contenido .= $this -> getMetodosSet();
            $contenido .= $this -> getMetodosGet();

            $contenido .= $this -> generarMetodoClone();
            $contenido .= PHP_EOL;
            
            $contenido .= "   }";
            
            if ( $etiqueta_fin )
              {
                 $contenido .= "?>";
              }

           //   var_dump( "Ubicacion", $ubicacion  );
            if ( $ubicacion )
              {
                 $directorio = $ubicacion . "/" ;
                 
                 $clase = $nombre_clase . ".php";
                 
                 OperacionArchivo::guardarContenido( $contenido, $directorio, $clase );      

                 //return $directorio . $clase;
                 return $nombre_clase;
              }
            else  
              {
                 return $contenido;
              }
         }

      /**
       * 
       * Nombre         	: 	getVariables
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	29/04/2012, 03:37:54
       * @return string
       */
      private function getVariables( )
         {
            $variables = "";
         
            if ( $this -> _variables )
              {
               if ( is_array( $this -> _variables ) && count( $this -> _variables ) > 0 )
                 {
                    $contador = 0;
                    
                    foreach ( $this -> _variables as $variable )
                      {
                         // Cargamos la informacion relacionada a las variables
                         /*
                          * Cargamos la informacion relacionada a las variables, ya que via comentarios
                          * Se procedera a generar la informacion del ORM 
                          */
                         if ( ConfiguracionGeneral::get( "ORM_OBTENER_INFO_COMENTARIO" ) == "1" )
                           {
                              $variables .= $this -> generarInfoCampoComentario( $this -> _campos[ $contador ]  );
                              $variables .= PHP_EOL;                                
                              $contador++;
                           }
                           
                         $variables .= "     " . $variable . PHP_EOL;
                      }
                 }
             }
         
            return $variables;
         }

      /**
       * 
       * Nombre         	: 	getContructor
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	29/04/2012, 03:37:58
       * @return string
       */
      private function getContructor( )
         {
            $constructor = "";
            
            if ( ConfiguracionGeneral::get( "ORM_GENERAR_COMENTARIOS_CONSTRUCTOR" ) == "1" )
              {
                 $constructor = $this -> generarComentario( "__construct" );
              }
            
            $constructor .= "      public function __construct()" . PHP_EOL. 
                            "        { " . PHP_EOL ;

            if ( $this -> _contenido_constructor )
               {
                  if ( is_array( $this -> _contenido_constructor ) && count( $this -> _contenido_constructor ) > 0 )
                     {
                        foreach ( $this -> _contenido_constructor as $variables )
                           {
                              $constructor .= "           " . $variables . PHP_EOL;
                           }
                     }
               }
               
             $constructor .=  "        }";  

            return $constructor;
         }

      /**
       * 
       * Nombre         	: 	getMetodosSet
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	29/04/2012, 12:37:28
       * @return string
       */ 
       function getMetodosSet( )
         {
            $metodos = "";

            if ( $this -> _metodos_set )
               {
                  if ( is_array( $this -> _metodos_set ) && count( $this -> _metodos_set ) > 0 )
                     {
                        foreach ( $this -> _metodos_set as $metodo )
                           {
                              $metodos .= $metodo . PHP_EOL . PHP_EOL;
                           }
                     }
               }

            return $metodos;
         }
         
         /**
          * 
          * Nombre         	: 	getMetodosGet
          * Descripcion   	:	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	29/04/2012, 12:37:23
          * @return string
          */
       private function getMetodosGet( )
         {
            $metodos = "";
         
            if ( $this -> _metodos_get )
              {
               if ( is_array( $this -> _metodos_get ) && count( $this -> _metodos_get ) > 0 )
                 {
                   foreach ( $this -> _metodos_get as $metodo )
                    {
                       $metodos .= $metodo . PHP_EOL . PHP_EOL;
                    }
                 }
             }
         
            return $metodos;
         }  
         
         /**
          * 
          * Nombre         	: 	generarComentario
          * Descripcion   	:	
          * Version 	    :  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	29/04/2012, 16:44:48
          * @param unknown_type $nombre
          * @param unknown_type $params
          * @param unknown_type $returns
          */
       private function generarComentario( $nombre, $params = array(), $returns = array(), $tabla = "" )
         {
            $documentacion = "   /** " . PHP_EOL .
                             "     * " . PHP_EOL .
                             "     * Nombre       : 	$nombre  " . PHP_EOL .
                             "     * Descripción  :	 " . PHP_EOL .
                             "     * Version 		:  	1.0 " . PHP_EOL .
                             "     * Autor:		:	Juan Jose Muñiz Juarez " . PHP_EOL .
                             "     * Fecha y Hora	:   " . date( "d/m/Y h:i:s" ) . PHP_EOL ;
            
            if ( $tabla )
              {
                 $documentacion .= "     * @tabla(name=\"$tabla\")" . PHP_EOL;
              }
            
            if ( $params )
              {
                 if ( is_array( $params ) && count( $params ) > 0 )
                   {
                      foreach ( $params as $param )
                        {
                           $documentacion .= "     * @param   	:   $param " . PHP_EOL;
                        }  
                   }
                 else 
                   {
                      $documentacion .= "     * @param   	:   $params " . PHP_EOL;
                   }  
              }
              
            if ( $returns )
              {
                 if ( is_array( $returns ) && count( $returns ) > 0 )
                   {
                     foreach ( $returns as $return )
                      {
                         $documentacion .= "     * @return  	:   $return " . PHP_EOL;
                      }
                   }
                 else
                  {
                     $documentacion .= "     * @return   	:   $returns " . PHP_EOL;
                  }
              }

            $documentacion .= "     */" . PHP_EOL;  
            return $documentacion;  
         }
         
         /**
          * 
          * Nombre         	: 	generarInfoTablaComentario
          * Descripcion   	:	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	01/05/2012, 12:47:30
          * @param unknown_type $campo
          */
       private function generarInfoCampoComentario( $campo )
         {
            if ( $campo )
              {
                 if ( isset( $this -> _info_campo[ $campo ] ) )
                   {
                      $comentario = "      /** " . PHP_EOL;
                      $info = $this -> _info_campo[ $campo ];
                      /*
                      "campo" => $campo,
                      "tipo" => $info_tipo[ 0 ],
                      "extra_tipo" => $info_tipo[ 1 ],
                      "nulo" => $info_campos[ 2 ],
                      "pk" => $info_campos[ 3 ],
                      "default" => $info_campos[ 4 ],
                      "extra" => $info_campos[ 5 ] */
                      if ( $info )
                        {
                           $asterisco = "        * ";
                           
                           if ( $info[ "campo" ] )
                            {
                               $comentario .= $asterisco . "@columna=\"". $info[ "campo" ] . "\"" . PHP_EOL;
                            }
                            
                           if ( $info[ "tipo" ] )
                            {
                               $comentario .= $asterisco . "@tipo=\"" . $info[ "tipo" ] . "\"" . PHP_EOL;
                            }
                            
                           $pk = "0";
                            
                           if ( $info[ "pk" ] )
                            {
                               if ( $info[ "pk" ] == "PRI" )
                                 {
                                    $pk = "1";
                                    
                                    $comentario .= $asterisco . "@id=\"$pk\"" . PHP_EOL;
                                 }  
                            }
                           
                           $auto_increment = "0";
                           
                           if ( $info[ "extra" ] )
                             {
                               if ( $info[ "extra" ] == "auto_increment" )
                                 {
                                   $auto_increment = "1";
                                   
                                   $comentario .= $asterisco . "@autoincrement=\"$auto_increment\"" . PHP_EOL;
                                 }
                             } 

                           if ( $info[ "extra_tipo" ] )
                            {
                               $comentario .= $asterisco . "@extra=\"" . $info[ "extra_tipo" ] . "\"" . PHP_EOL;
                            }
                            
                           $default = "";
                            
                            if ( $info[ "default" ] )
                             {
                                $default = $info[ "default" ];
                             }  
                             
                           $comentario .= $asterisco . "@default=\"" . $default . "\"" . PHP_EOL;
                             
                           $comentario .= "      */";  
                           
                           return $comentario;
                        }
                   }
              }
              
            return "";  
         }  

         /**
          *
          * Nombre         	: 	generarGet
          * Descripcion   	:
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	29/04/2012, 03:39:21
          * @param unknown_type $campo
          * @param unknown_type $acceso
          */
       public function generarGet( $campo, $acceso = "public" )
         {
            if ( $campo )
              {
                 $codigo = "";
                 
                 if ( ConfiguracionGeneral::get( "ORM_GENERAR_COMENTARIOS_GET" ) == "1" )
                   {
                      $codigo = $this ->generarComentario( "get" . ucfirst( $campo ),"", $campo );
                   }
                   
                 $codigo .=  "    ". $acceso . " function get" . ucfirst( $campo ) . "() " . PHP_EOL
                         . "      { " . PHP_EOL
                         . "        return \$this -> _" . $campo . ";". PHP_EOL
                         . "      } ";
         
                  $this -> _metodos_get[ ] = $codigo;
              }
         }
         
         /**
          *
          * Nombre         	: 	generarSet
          * Descripcion   	:
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	29/04/2012, 03:39:25
          * @param unknown_type $campo
          * @param unknown_type $acceso
          */
       public function generarSet( $info_campos, $acceso = "public" )
         {
            if ( $info_campos )
               {
                  $campo = $info_campos[ 0 ];  // Nombre del campo
                  
                  $codigo = "";
                  
                  if ( ConfiguracionGeneral::get( "ORM_GENERAR_COMENTARIOS_SET" ) == "1" )
                    {
                       $codigo = PHP_EOL . $this ->generarComentario( "set" . ucfirst( $campo ), $campo );
                    }
                   
                  $codigo .= "    ". $acceso . " function set" . ucfirst( $campo ) . "( \$" . $campo . " ) " . PHP_EOL
                           . "      { " . PHP_EOL
                           . "         \$this -> _" . $campo . " = \$" . $campo . ";" . PHP_EOL
                           . "      }";
            
                  $this -> _metodos_set[ ] = $codigo;                            
            
                  $this -> _variables [] = " private \$_" . $campo . ";";
                  $this -> _campos[ ] = $campo;
                  
                  $default = "null";
                  
                  if ( ConfiguracionGeneral::get( "ORM_OBTENER_INFO_COMENTARIO" ) == "1" )
                    {
                        $tipo = "";
                        $extra_tipo = "";
                        
                        if ( $info_campos[ 1 ] )
                          {
                             if ( strpos( $info_campos[ 1 ], " " ) !== false )                      
                               {
                                  list( $tipo, $extra_tipo ) = explode( " ", $info_campos[ 1 ] );     
                               }
                             else
                               {
                                  $tipo = $info_campos[ 1 ];
                               }  
                          }
                        
                        $this -> _info_campo[ $campo ] =  array(
                                                                  "campo" => $campo,    
                                                                  "tipo" => $tipo,
                                                                  "extra_tipo" => $extra_tipo,
                                                                  "nulo" => $info_campos[ 2 ],
                                                                  "pk" => $info_campos[ 3 ],
                                                                  "default" => $info_campos[ 4 ],
                                                                  "extra" => $info_campos[ 5 ]                           
                                                              );
                        
                        // Obtenemos el valor default que recibe el campo para generarlo en el constructor
                        if ( isset( $info_campos[ 4 ] ) && $info_campos[ 4 ] != "" )
                          {
                             $default = $info_campos[ 4 ];
                          }
                    }
                    // Inicializando los atributos
                  $this -> _contenido_constructor[] = "\$this -> set". ucfirst( $campo ) . "( " .( $default != "null" ? "'$default'" : $default ) . " ); ";
                  $this -> _contenido_clone[] = "\$this -> set". ucfirst( $campo ) . "( null ); ";
               }
         } 

         /**
          * 
          * Nombre         	: 	generarMetodoClone
          * Descripcion   	:	
          * Version 		:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	03/05/2012, 22:26:43
          */
       private function generarMetodoClone()
         {
            $clone = "    public function __clone() " . PHP_EOL
                   . "      { " . PHP_EOL
                   . "          " . PHP_EOL;
            
            if ( $this -> _contenido_clone )
               {
                  if ( is_array( $this -> _contenido_clone ) && count( $this -> _contenido_clone ) > 0 )
                     {
                        foreach ( $this -> _contenido_clone as $variables )
                           {
                              $clone .= "           " . $variables . PHP_EOL;
                           }
                     }
               }
            
            $clone .= "      } " . PHP_EOL;
            
            return $clone;
         }  
   }
